package style.Leetcode.初级算法.array.array_20220801_2_移动零;

/**
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 * 示例 1:
 * 输入: nums = [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 * 示例 2:
 * 输入: nums = [0]
 * 输出: [0]
 */
public class Solution {
    /**
     * 思路1：
     *      1、非0的往前挪
     *      2、后面的位置置0
     */
    public void moveZeroes1(int[] nums) {
        if (null == nums || nums.length == 0) return;

        int index = 0;
        // 一次遍历， 把非0的往前挪
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[index++] = nums[i];
            }
        }
        // 后面的都置为0
        while (index <nums.length) {
            nums[index++] = 0;
        }
    }

    /**
     *  思路2：
     *      只要非0就往前挪
     */
    public void moveZeroes2(int[] nums) {
        if (null == nums || nums.length == 0) return;

        int index = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                int temp = nums[index];
                nums[index] = nums[i];
                nums[i] = temp;
                index++;
            }
        }

        for (int num : nums) {
            System.out.println(num);
        }
    }





    public static void main(String[] args) {
        Solution solution = new Solution();
//        solution.moveZeroes1(new int[]{0, 1, 0, 3, 12});
        solution.moveZeroes2(new int[]{0, 1, 0, 3, 12});
    }
}
